package com.grace.service;

import com.google.common.base.Preconditions;
import com.grace.beans.PageQuery;
import com.grace.beans.PageResult;
import com.grace.common.RequestHolder;
import com.grace.dao.SysLogMapper;
import com.grace.dao.SysUserMapper;
import com.grace.exception.ParamException;
import com.grace.model.SysUser;
import com.grace.param.UserParam;
import com.grace.util.BeanValidator;
import com.grace.util.IpUtil;
import com.grace.util.MD5Util;
import com.grace.util.PasswordUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;


@Service
public class SysUserService {

    @Resource
    private SysUserMapper sysUserMapper;    //关于数据库

    @Autowired
    private SysLogService sysLogService;

    /**
     * 获取所有用户信息
     */
    public List<SysUser> getAll() {
        return sysUserMapper.getAll();
    }


    /**
     * save新增用户数据库方法
     *
     * @param param
     */
    public void save(UserParam param) {
        //判断
        BeanValidator.check(param); //相同的check
        //判断邮箱是否被占用
        if (checkEmailExist(param.getEmail(), param.getId())) {
            throw new ParamException("邮箱已被占用");
        }
        //判断电话是否被占用
        if (checkTelephoneExist(param.getTelephone(), param.getId())) {
            throw new ParamException("电话已被占用");
        }

        //生成一个psw 1工具类生成psd（通过邮箱告诉处理信息）
        //2、自己输入psw（社交平台）

        String password = PasswordUtil.randomPassword();   //一会儿在写工具生成psd
        password = "12345678";   //一会儿在写工具生成psd
        //考虑到不能明文加密 encryptedPassword加密密码（md5加密）
        String encryptedPassword = MD5Util.encrypt(password);
        //这些是通过参数赋值的
        SysUser user = SysUser.builder().username(param.getUsername())
                .telephone(param.getTelephone()).email(param.getEmail())
                .password(encryptedPassword).deptId(param.getDeptId())
                .remark(param.getRemark()).build();
        //设置其它默认生成的值
        //设置操作者
        //user.setOperator("system");
        user.setOperator(RequestHolder.getCurrentUser().getUsername());
        //设置操作时间
        user.setOperatorTime(new Date());
        //TODD:sendEmail
        //要通过邮件通知用户 //TODO: sendEmail
        //要保证email发送成功，才能做更新操作，如果email发送失败但做了更新操作
        // 用户名密码就再也不知道了，要通过邮件通知用户

        //将user插入
        sysUserMapper.insertSelective(user);
        //记录日志
        sysLogService.saveUserLog(null, user);
    }

    /**
     * update更新用户数据库方法
     *
     * @param param
     */
    public void update(UserParam param) {
        //判断
        BeanValidator.check(param); //相同的check
        //判断邮箱是否被占用
        if (checkEmailExist(param.getEmail(), param.getId())) {
            throw new ParamException("邮箱已被占用");
        }
        //判断电话是否被占用
        if (checkTelephoneExist(param.getTelephone(), param.getId())) {
            throw new ParamException("电话已被占用");
        }
        //取出之前的用户
        SysUser before = sysUserMapper.selectByPrimaryKey(param.getId());
        //如果是空的话，可以有信息返回
        Preconditions.checkNotNull(before, "待更新的用户不存在");
        //取出更新之后的user，记录日志使用的before和after
        SysUser after = SysUser.builder().id(param.getId()).username(param.getUsername()).telephone(param.getTelephone()).email(param.getEmail()).deptId(param.getDeptId()).status(param.getStatus()).remark(param.getRemark()).build();

        //设置操作者
        after.setOperator(RequestHolder.getCurrentUser().getUsername());
        //设置操作时间
        after.setOperatorTime(new Date());
        String remoteIp = IpUtil.getRemoteIp(RequestHolder.getCurrentRequest());
        System.out.println("remoteIp: " + remoteIp);
        //通过接口进行更新，更新函数通过id进行更新
        sysUserMapper.updateByPrimaryKeySelective(after);
        //记录日志
        sysLogService.saveUserLog(before, after);

    }

    /**
     * 判断邮箱是否存在
     *
     * @param email
     * @param userId
     * @return
     */
    public boolean checkEmailExist(String email, Integer userId) {

        return sysUserMapper.countByMail(email, userId) > 0; //表示不存在相同的email
    }

    /**
     * 判断电话是否存在
     *
     * @param telephone
     * @param userId
     * @return
     */
    public boolean checkTelephoneExist(String telephone, Integer userId) {
        return sysUserMapper.countByTelephone(telephone, userId) > 0; //表示不存在相同的telephone
    }


    /**
     * 拿到一个username的时候，查对应的电话和邮箱是否相同
     *
     * @param keyword
     * @return
     */
    public SysUser findByKeyword(String keyword) {
        return sysUserMapper.findByKeyword(keyword);    //一会儿实现
    }


    public PageResult<SysUser> getPageByDeptId(int deptId, PageQuery page) {
        //对参数进行校验
        BeanValidator.check(page);
        //查询一下总条数
        int count = sysUserMapper.countByDeptId(deptId);
        if (count > 0) {
            List<SysUser> list = sysUserMapper.getPageByDeptId(deptId, page);
            return PageResult.<SysUser>builder().total(count).data(list).build();
        }
        return PageResult.<SysUser>builder().build();
    }

}
